package main.java.sq;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class Partida {

	// Patron Singleton:
	private static Partida INSTANCE = null;

	private synchronized static void crearPartida() {
		if (INSTANCE == null) {
			INSTANCE = new Partida();
		}
		// TODO Al crear partida hay que crear 2 o 3 jugadores.
		// Si 2 jugadores -> sistema de planetas 3x3 con planetas prefijados.
		// Si 3 jugadores -> todos los planetas disponibles.
		// Se le muestran a cada jugador aleatoriamente 2 planetas con mercado
		// de los que tiene que escoger uno como planeta natal
		// Se colocan los planetas en el sistema de la forma preestablecida para
		// 2 o 3 jugadores.
		// Los jugadores deciden las naves con las que comienzan.
		// Se crea la fila de acciones con numero de cartas para 2 o 3
		// jugadores.
		// Se crea pila de robo.
	}

	private Partida() {

	}

	public static Partida getPartida() {
		if (INSTANCE == null) {
			crearPartida();
		}
		return INSTANCE;
	}

	/**
	 * @uml.property name="jugador"
	 * @uml.associationEnd multiplicity="(2 3)" aggregation="composite"
	 *                     inverse="partida:sq.Jugador"
	 */
	private List<Jugador> jugadores;

	/**
	 * Getter of the property <tt>jugador</tt>
	 * 
	 * @return Returns the jugador.
	 * @uml.property name="jugador"
	 */
	public List<Jugador> getJugador() {
		return jugadores;
	}

	/**
	 * Setter of the property <tt>jugador</tt>
	 * 
	 * @param jugador
	 *            The jugador to set.
	 * @uml.property name="jugador"
	 */
	public void setJugador(List<Jugador> jugador) {
		this.jugadores = jugador;
	}

	/**
	 * @uml.property name="accion"
	 * @uml.associationEnd multiplicity="(0 -1)" aggregation="composite"
	 *                     inverse="partida:sq.Accion"
	 */
	private List<Accion> accion;

	/**
	 * Getter of the property <tt>accion</tt>
	 * 
	 * @return Returns the accion.
	 * @uml.property name="accion"
	 */
	public List<Accion> getAccion() {
		return accion;
	}

	/**
	 * Setter of the property <tt>accion</tt>
	 * 
	 * @param accion
	 *            The accion to set.
	 * @uml.property name="accion"
	 */
	public void setAccion(List<Accion> accion) {
		this.accion = accion;
	}

	public void agregaAccion(Accion accion) {
		this.accion.add(accion);
	}

	/**
	 * @uml.property name="pilaDeRobo"
	 */
	private List<Accion> pilaDeRobo;

	/**
	 * Getter of the property <tt>pilaDeRobo</tt>
	 * 
	 * @return Returns the pilaDeRobo.
	 * @uml.property name="pilaDeRobo"
	 */
	public List<Accion> getPilaDeRobo() {
		return pilaDeRobo;
	}

	/**
	 * Setter of the property <tt>pilaDeRobo</tt>
	 * 
	 * @param pilaDeRobo
	 *            The pilaDeRobo to set.
	 * @uml.property name="pilaDeRobo"
	 */
	public void setPilaDeRobo(List<Accion> pilaDeRobo) {
		this.pilaDeRobo = pilaDeRobo;
	}

	
	/**
	 * @uml.property name="ronda"
	 */
	private int ronda = 0;

	/**
	 * Getter of the property <tt>ronda</tt>
	 * 
	 * @return Returns the ronda.
	 * @uml.property name="ronda"
	 */
	public int getRonda() {
		return ronda;
	}

	/**
	 * Setter of the property <tt>ronda</tt>
	 * 
	 * @param ronda
	 *            The ronda to set.
	 * @uml.property name="ronda"
	 */
	public void setRonda(int ronda) {
		this.ronda = ronda;
	}

	/**
					 */
	public void siguienteRonda() {
	}

	public List intercambiaposicion(int pos1, int pos2) {

		return null;
	}

	/**
				 */
	public void ejecutarTurno() {
	}

	/**
		 */
	public Jugador getJugadorActual() {
		Integer id=1;
		for (int i=0;i<jugadores.size();i++) {
			if (jugadores.get(i).isEsTurno()){
				id = jugadores.get(i).getId();
				break;
			}
		}
		return getJugadorPorId(id);
	}

	public void siguienteJugador() {
		
		int posicion= getJugador().indexOf(getJugadorActual());
		
		if(posicion+1 >= getJugador().size()){
			getJugador().get(0).setEsTurno(true);
			getJugador().get(posicion).setEsTurno(false);
		}else{
			getJugador().get(posicion+1).setEsTurno(true);
			getJugador().get(posicion).setEsTurno(false);
		}
	}

	/**
	 * @uml.property name="Sistema"
	 */
	private Sistema sistema;

	/**
	 * Getter of the property <tt>Sistema</tt>
	 * 
	 * @return Returns the sistema.
	 * @uml.property name="Sistema"
	 */
	public Sistema getSistema() {
		return sistema;
	}

	/**
	 * Setter of the property <tt>Sistema</tt>
	 * 
	 * @param Sistema
	 *            The sistema to set.
	 * @uml.property name="Sistema"
	 */
	public void setSistema(Sistema sistema) {
		this.sistema = sistema;
	}

	/**
		 */
	public Jugador getJugadorPorId(int id) {
		Iterator<Jugador> it = jugadores.iterator();
		Jugador j = null;
		while (it.hasNext()) {
			Jugador p = it.next();
			if (p.getId() == id) {
				j = p;
				break;
			}
			
		}
		return j;
	}

}
